#!/usr/bin/python3
# -*- coding: UTF-8 -*-


# 每次均要核对统计局给的表格列名
# 必须按以下列顺序
# A     B          C                D            E          F          G                H
# 县区	项目名称	登记注册统计类别	企业控股情况	隶属关系	建设性质	期末项目建设状态	项目行业编码

# I          J            K             L
# 计划总投资	累计完成投资	本年完成投资	建安工程

# 只和上个月的数据进行计算，获取当月完成投资，不再计算去年了
# 去年的数据算出来也不含省返，数据没有意义
#
#

import pandas as pd
import openpyxl
import openpyxl.utils.dataframe as dataframe_utils
import sys
import argparse
from rich import print as rprint

sys.path.append("../lib")
from inner_util import prepare_dir, try_file_path


# 能源工业投资行业代码
ENERGY_CODES = [6, 7, 25, 44, 45]


# 能源外工业投资行业代码
NO_ENERGY_INDUSTRY_CODES = [
    46,
]

# 能源外工业行业代码
C1 = [x for x in range(8, 25)]
C2 = [x for x in range(26, 44)]
NO_ENERGY_INDUSTRY_CODES.extend(C1)
NO_ENERGY_INDUSTRY_CODES.extend(C2)

# 卷烟及配套产业行业代码
CIGARETTE_CODES = [16]
# 生物医药产业行业代码
MEDICINE_CODES = [27]
# 钢铁行业代码
STEEL_CODES = [31]
# 先进制造业行业代码
ADVANCE_MANUFACTURING_CODES = [x for x in range(34, 41)]

# ALL_CODES 是所有工业投资行业代码
ALL_CODES = list(NO_ENERGY_INDUSTRY_CODES)
ALL_CODES.extend(ENERGY_CODES)

# 民间投资看D列企业控股情况
MINGJIAN_CODES = [2, 3, 9]

DIST_DIR = "dist"

INDUSTRY_CODES = {
    1: "农业",
    2: "林业",
    3: "畜牧业",
    4: "渔业",
    5: "农、林、牧、渔专业及辅助性活动",
    6: "煤炭开采和洗选业",
    7: "石油和天然气开采业",
    8: "黑色金属矿采选业",
    9: "有色金属矿采选业",
    10: "非金属矿采选业",
    11: "开采专业及辅助性活动",
    12: "其他采矿业",
    13: "农副食品加工业",
    14: "食品制造业",
    15: "酒、饮料和精制茶制造业",
    16: "烟草制品业",
    17: "纺织业",
    18: "纺织服装、服饰业",
    19: "皮革、毛皮、羽毛及其制品和制鞋业",
    20: "木材加工和木、竹、藤、棕、草制品业",
    21: "家具制造业",
    22: "造纸和纸制品业",
    23: "印刷和记录媒介复制业",
    24: "文教、工美、体育和娱乐用品制造业",
    25: "石油、煤炭及其他燃料加工业",
    26: "化学原料和化学制品制造业",
    27: "医药制造业",
    28: "化学纤维制造业",
    29: "橡胶和塑料制品业",
    30: "非金属矿物制品业",
    31: "黑色金属冶炼和压延加工业",
    32: "有色金属冶炼和压延加工业",
    33: "金属制品业",
    34: "通用设备制造业",
    35: "专用设备制造业",
    36: "汽车制造业",
    37: "铁路、船舶、航空航天和其他运输设备制造业",
    38: "电气机械和器材制造业",
    39: "计算机、通信和其他电子设备制造业",
    40: "仪器仪表制造业",
    41: "其他制造业",
    42: "废弃资源综合利用业",
    43: "金属制品、机械和设备修理业",
    44: "电力、热力生产和供应业",
    45: "燃气生产和供应业",
    46: "水的生产和供应业",
    47: "房屋建筑业",
    48: "土木工程建筑业",
    49: "建筑安装业",
    50: "建筑装饰、装修和其他建筑业",
    51: "批发业",
    52: "零售业",
    53: "铁路运输业",
    54: "道路运输业",
    55: "水上运输业",
    56: "航空运输业",
    57: "管道运输业",
    58: "多式联运和运输代理业",
    59: "装卸搬运和仓储业",
    60: "邮政业",
    61: "住宿业",
    62: "餐饮业",
    63: "电信、广播电视和卫星传输服务",
    64: "互联网和相关服务",
    65: "软件和信息技术服务业",
    66: "货币金融服务",
    67: "资本市场服务",
    68: "保险业",
    69: "其他金融业",
    70: "房地产业",
    71: "租赁业",
    72: "商务服务业",
    73: "研究和试验发展",
    74: "专业技术服务业",
    75: "科技推广和应用服务业",
    76: "水利管理业",
    77: "生态保护和环境治理业",
    78: "公共设施管理业",
    79: "土地管理业",
    80: "居民服务业",
    81: "机动车、电子产品和日用产品修理业",
    82: "其他服务业",
    83: "教育",
    84: "卫生",
    85: "社会工作",
    86: "新闻和出版业",
    87: "广播、电视、电影和录音制作业",
    88: "文化艺术业",
    89: "体育",
    90: "娱乐业",
    91: "中国共产党机关",
    92: "国家机构",
    93: "人民政协、民主党派",
    94: "社会保障",
    95: "群众团体、社会团体和其他成员组织",
    97: "国际组织",
}


print("行业代码")
print("全部工业投资行业代码", ALL_CODES)
print("能源外工业行业代码", NO_ENERGY_INDUSTRY_CODES)
print("先进制造行业代码", ADVANCE_MANUFACTURING_CODES)

print("-------------------------------------------")


def usage():
    print("""Usage: 
python3 analsis.py [file_path] [month] [last_month_data_file_path]""")
    print("""
# A     B          C                D            E          F          G                H
# 县区	项目名称	登记注册统计类别	企业控股情况	隶属关系	建设性质	期末项目建设状态	项目行业编码

# I          J            K             L
# 计划总投资  累计完成投资	 本年完成投资	 建安工程
          
""")
    quit()


def wan2yi(val):
    return round(val / 10000, 2)


def calc_percent(a, b):
    return f"{a / b *100:.2f}%"


class Industry:
    def __init__(self, file_path, month):
        self.file_path = file_path
        self.month = month

        names = [
            "A",
            "B",
            "C",
            "D",
            "E",
            "F",
            "G",
            "H",
            "I",
            "J",
            "K",
            "L",
        ]
        self.df = pd.read_excel(file_path, sheet_name=0, header=0, names=names)

    def filter_col_array(self, industry_array, col="H"):
        """
        按某列过滤值是否在数组内
        默认是行业代码H列过滤
        """
        # 统计的表行业代码是4位数，所以要取前两位
        return self.df[(self.df[col] // 100).isin(industry_array)]

    def calc_year_sum(self, industry_array, col="K"):
        """
        按某列累计求和
        默认是本年完成投资K列
        """
        industry_df = self.filter_col_array(industry_array)
        return wan2yi(industry_df[col].sum())

    def calc_count(self, industry_array, col="B"):
        """
        按某列累计求和
        默认是项目名称B列
        """
        industry_df = self.filter_col_array(industry_array)
        return industry_df[col].count()

    def calc_last_month(self, last_month_ind, codes=ALL_CODES):
        投资 = self.calc_year_sum(codes)
        上月投资 = last_month_ind.calc_year_sum(codes)
        当月完成投资 = round(投资 - 上月投资, 2)
        return 当月完成投资

    def 计算重点工业投资(self):
        卷烟投资 = self.calc_year_sum(CIGARETTE_CODES)
        钢铁投资 = self.calc_year_sum(STEEL_CODES)
        生物医药投资 = self.calc_year_sum(MEDICINE_CODES)
        先进制造业投资 = self.calc_year_sum(ADVANCE_MANUFACTURING_CODES)

        paragraph = f"""玉溪市2024年1-{self.month}月卷烟及配套产业完成投资{卷烟投资}亿元；钢铁行业完成投资{钢铁投资}亿元；生物医药产业完成投资{生物医药投资}亿元；先进制造业完成投资{先进制造业投资}亿元。"""
        print(paragraph)

    def 统计在库项目总投资分档(self):
        # 1亿元以上项目
        gongye_df = self.filter_col_array(ALL_CODES)

        s1 = gongye_df[gongye_df["I"] >= 10000]["B"]
        s1_count = s1.count()
        print(f"1亿元以上项目{s1_count}个")

        res = pd.cut(
            x=gongye_df["I"],
            bins=[10000, 100000, 300000, 10000000],
            labels=["1-10亿元", "10-30亿元", "30亿元以上"],
            right=False,
            include_lowest=True,
        ).value_counts()

        print(f"1-10亿元项目{res[0]}个")

        print(f"10-30亿元项目{res[1]}个")

        print(f"30亿元以上项目{res[2]}个")

    def 计算截止当前完成投资(self):
        工业投资 = self.calc_year_sum(ALL_CODES)
        能源外工业投资 = self.calc_year_sum(NO_ENERGY_INDUSTRY_CODES)
        能源投资 = self.calc_year_sum(ENERGY_CODES)

        paragraph = f"玉溪市2024年1-{self.month}月工业投资完成{工业投资}亿元，同比增长xx%，占产业投资比重xx%，下月投资预计完成xx亿元；能源以外工业投资完成{能源外工业投资}亿元；能源工业投资完成{能源投资}亿元。能源外工业投资同比增长xx%。"

        print(paragraph)

    def save_as(self, df, file_path):
        """输出dataframe样式的表格"""
        rows = dataframe_utils.dataframe_to_rows(df, index=False, header=False)

        wb = openpyxl.Workbook()
        ws = wb.active

        head = [
            "县区",
            "项目名称",
            "登记注册统计类别",
            "企业控股情况",
            "隶属关系",
            "建设性质",
            "期末项目建设状态",
            "项目行业编码",
            "计划投资",
            "累计投资",
            "本年完成投资",
            "建安投资",
        ]
        ws.append(head)
        for row in rows:
            ws.append(row)

        # for cell in ws["A"] + ws[1]:
        #     cell.style = "Pandas"

        wb.save(try_file_path(file_path))


def 计算项目个数和当月完成投资(ind: Industry, last_month_ind: Industry):
    工业投资项目个数 = ind.calc_count(ALL_CODES)

    当月完成投资 = ind.calc_last_month(last_month_ind, ALL_CODES)

    能源外当月完成投资 = ind.calc_last_month(last_month_ind, NO_ENERGY_INDUSTRY_CODES)

    paragraph1 = f"玉溪市工业在库项目共{工业投资项目个数}个，{ind.month}月当月完成投资{当月完成投资}亿元。"

    能源外工业投资项目个数 = ind.calc_count(NO_ENERGY_INDUSTRY_CODES)

    paragraph3 = f"玉溪市能源外工业在库项目共{能源外工业投资项目个数}个，{ind.month}月当月完成投资{能源外当月完成投资}亿元。"

    工业投资 = ind.calc_year_sum(ALL_CODES)
    能源外工业投资 = ind.calc_year_sum(NO_ENERGY_INDUSTRY_CODES)

    能源外工业投资占比 = calc_percent(能源外工业投资, 工业投资)
    能源外工业投资项目个数占比 = calc_percent(能源外工业投资项目个数, 工业投资项目个数)

    gongye_df = ind.filter_col_array(ALL_CODES)

    mingjian_df = gongye_df[gongye_df["D"].isin(MINGJIAN_CODES)]

    民间投资 = wan2yi(mingjian_df["K"].sum())
    民间投资项目个数 = mingjian_df["B"].count()

    民间投资额占比 = calc_percent(民间投资, 工业投资)
    民间投资项目个数占比 = calc_percent(民间投资项目个数, 工业投资项目个数)

    paragraph2 = f"能源以外工业投资项目投资额占比{能源外工业投资占比}、投资项目个数占比{能源外工业投资项目个数占比}，工业投资中民间投资项目投资额占比{民间投资额占比}、项目个数占比{民间投资项目个数占比}。"

    print(paragraph1)

    print(paragraph2)

    print(paragraph3)


def 投资最大的项目(ind: Industry, last_n=30, col="K"):
    工业投资df = ind.filter_col_array(ALL_CODES)
    res = 工业投资df.nlargest(last_n, col)
    stat_df = res[["B", "H", col]]

    stat_df.to_excel(f"2024年1-{ind.month}月_{col}列_投资最大的项目.xlsx")

    print(stat_df)


def 分析投资行业(ind: Industry):
    g_df = ind.filter_col_array(ALL_CODES)

    suliao = ind.filter_col_array([29])
    print(suliao)

    adf = g_df.copy()

    adf["AA"] = adf["H"].apply(lambda x: INDUSTRY_CODES.get(x // 100))
    stat_df = adf.copy()

    grouped_sum = stat_df.groupby("AA")["K"].sum()
    sorted_grouped_sum = grouped_sum.sort_values(ascending=False)

    print("a", sorted_grouped_sum)

    sorted_grouped_sum.to_excel(f"2024年1-{ind.month}月_各行业投资情况.xlsx")


def parse_args():
    parser = argparse.ArgumentParser(description="分析统计表格")
    parser.add_argument("data")
    parser.add_argument("month", type=int)
    parser.add_argument("last_month_data")

    return parser.parse_args()


def main():
    args = parse_args()

    rprint("Args", args)

    prepare_dir(DIST_DIR)

    industry = Industry(args.data, args.month)

    industry.save_as(
        industry.filter_col_array(ALL_CODES),
        f"{DIST_DIR}/{args.month}月_工业投资数据.xlsx",
    )

    print("计算本年完成投资")
    industry.计算截止当前完成投资()

    print("--------------------------------------")

    if args.last_month_data != "nil":
        print("项目个数和当月完成投资")
        last_month_ind = Industry(args.last_month_data, args.month - 1)
        计算项目个数和当月完成投资(industry, last_month_ind)

        print("--------------------------------------")

    print("重点工业行业投资情况")
    industry.计算重点工业投资()

    print("--------------------------------------")

    print("在库项目总投资分档")
    industry.统计在库项目总投资分档()

    print("--------------------------------------")

    print("问统计局5个数")
    print(f"""2024年1-{args.month}月工业投资完成xx亿元，同比增长xx%，占产业投资比重xx%
能源以外工业投资完成xx亿元，同比增长xx%。""")

    print("--------------------------------------")

    # 投资最大的项目(industry)

    # 分析投资行业(industry)


if __name__ == "__main__":
    main()
